﻿using AutoMapper;
using HamcoWcs.Contract.ContractCommon;
using HamcoWcs.Contract.ContractForeEnd;
using HamcoWcs.DAL;
using HamcoWcs.Entitys.EdgeInfos;
using HamcoWcs.Entitys.NodeInfos;
using HamcoWcs.Entitys.PathInfos;
using HamcoWcs.Models.Common;
using HamcoWcs.Models.Common.Enums;
using HamcoWcs.Models.Exceptions;
using HamcoWcs.Models.ForeEndModels.UIPaths;
using HamcoWcs.Service.Common;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace HamcoWcs.Service.ForeEnd
{
    [AutoInject(typeof(IForeEndPathService), InjectType.Scope)]
    public class ForeEndPathService : IForeEndPathService
    {

        private readonly WcsDbContext _wcsDbContext;
        private readonly IMapper _mapper;
        private readonly AutomaticStorageInfo _asrs;
        private readonly IPathService _pathService;
        public ForeEndPathService(WcsDbContext wcsDbContext, IMapper mapper, AutomaticStorageInfo asrs, IPathService pathService)
        {
            _wcsDbContext = wcsDbContext;
            _mapper = mapper;
            _asrs = asrs;
            _pathService = pathService;
        }

        public bool CreateNode(UINodeCreateModel model)
        {
            model.NodeName = model.NodeName.ToUpper();
            var isExists = _wcsDbContext.NodeInfos.Any(x => x.NodeName == model.NodeName);
            if (isExists) throw new WarningException($"已存在Node:{model.NodeName}");

            _wcsDbContext.NodeInfos.Add(new NodeInfo()
            {
                NodeName = model.NodeName,
                AlternateNode = model.AlternateNode,
                DeviceType = model.DeviceType,
                NextNode = model.NextNode,
                InName = "",
                OutName = "",
                FPriority = 0,
                TPriority = 0,
            });

            try
            {
                return _wcsDbContext.SaveChanges() > 0;
            }
            catch (Exception)
            {
                throw new WarningException("数据库保存失败");
            }
        }

        public bool DeleteNode(UINodeDeleteModel model)
        {
            var nodeInfo = _wcsDbContext.NodeInfos.FirstOrDefault(x => x.Id == model.Id)
                ?? throw new WarningException($"未找到Id:{model.Id}的Node");

            _wcsDbContext.NodeInfos.Remove(nodeInfo);

            try
            {
                return _wcsDbContext.SaveChanges() > 0;
            }
            catch (Exception)
            {
                throw new WarningException("数据库保存失败");
            }
        }

        public bool UpdateNode(UINodeUpdateModel model)
        {
            var nodeInfo = _wcsDbContext.NodeInfos.FirstOrDefault(x => x.Id == model.Id)
                ?? throw new WarningException($"未找到Id:{model.Id}的Node");

            nodeInfo.AlternateNode = model.AlternateNode;
            nodeInfo.NextNode = model.NextNode;
            nodeInfo.DeviceType = model.DeviceType;
            nodeInfo.OutName = model.OutName;
            nodeInfo.InName = model.InName;
            nodeInfo.FPriority = model.FPriority;
            nodeInfo.TPriority = model.TPriority;

            try
            {
                return _wcsDbContext.SaveChanges() > 0;
            }
            catch (Exception)
            {
                throw new WarningException("数据库保存失败");
            }
        }

        public ForeEndResult GetNodes(UINodeQueryModel model)
        {
            var data = _wcsDbContext.NodeInfos
                                     .AsQueryable()
                                     .VagueWhereOut(model, out int count, out int pageCount)
                                     .ToList();

            return new ForeEndResult(data, count, pageCount);
        }


        public ForeEndResult GetEdges(UIEdgeQueryModel model)
        {
            var data = _wcsDbContext.EdgeInfos
                              .AsQueryable()
                              .VagueWhereOut(model, out int count, out int pageCount)
                              .ToList();

            return new ForeEndResult(data, count, pageCount);
        }



        public ForeEndResult GetPaths(UIPathQueryModel model)
        {
            var data = _wcsDbContext.Set<PathInfo>()
                  .AsQueryable()
                  .VagueWhereOut(model, out int count, out int pageCount)
                  .ToList();

            var d = _mapper.Map<List<UIPathInfo>>(data);

            foreach (var p in _pathService.GetAllPath().Values)
            {
                var t = d.FirstOrDefault(x => x.PathName == p.PathName);
                if (t == null) continue;

                var nodeNames = p.UsedPath.Split('-').ToList();

                var nodes = _asrs.Nodes.Where(x => nodeNames.Contains(x.NodeName)).ToList();

                t.Enabled = nodes.All(x =>x.IsRunning);
            }


            return new ForeEndResult(d, count, pageCount);
        }

        public void AddPath(UIAddPathModel model)
        {
            try
            {
                if (string.IsNullOrEmpty(model.From)) throw new WarningException("请输入起始地");
                if (string.IsNullOrEmpty(model.To)) throw new WarningException("请输入目的地");
                if (string.IsNullOrEmpty(model.DefaultPath)) throw new WarningException("请输入路径");
                var fnode = _wcsDbContext.NodeInfos.AsNoTracking().FirstOrDefault(x => x.NodeName == model.From)
                    ?? throw new WarningException("未找到起始地" + model.From);
                var tnode = _wcsDbContext.NodeInfos.AsNoTracking().FirstOrDefault(x => x.NodeName == model.To)
                    ?? throw new WarningException("未找到目的地" + model.To);
                var pathName = $"{model.From}-{model.To}";
                var path = _wcsDbContext.PathInfos.AsNoTracking().FirstOrDefault(x => x.PathName == pathName);
                if (path != null) throw new WarningException($"已存在路径{pathName}");

                var paths = model.DefaultPath.Split('-');
                if (paths.Length <= 1) throw new WarningException("错误的路径");

                var edges = _wcsDbContext.EdgeInfos.AsNoTracking().ToDictionary(k => k.EdgeName, v => v);
                for (int i = 0; i < paths.Length - 1; i++)
                {
                    string t = $"{paths[i]}-{paths[i + 1]}";
                    if (!edges.ContainsKey(t))
                        throw new WarningException($"未找到短路径{t}");
                }

                var newPath = new PathInfo()
                {
                    FromNode = model.From,
                    ToNode = model.To,
                    AlternatePaths = "",
                    DefaultPath = model.DefaultPath,
                    PathName = pathName,
                    PathType = 0
                };

                _wcsDbContext.PathInfos.Add(newPath);
                _wcsDbContext.SaveChanges();
            }
            catch (Exception)
            {
                throw;
            }
        }


        public void AddEdge(UIAddEdgeModel model)
        {
            try
            {
                if (string.IsNullOrEmpty(model.From)) throw new WarningException("请输入起始地");
                if (string.IsNullOrEmpty(model.To)) throw new WarningException("请输入目的地");

                var fnode = _wcsDbContext.NodeInfos.AsNoTracking().FirstOrDefault(x => x.NodeName == model.From)
                    ?? throw new WarningException("未找到起始地" + model.From);
                var tnode = _wcsDbContext.NodeInfos.AsNoTracking().FirstOrDefault(x => x.NodeName == model.To)
                    ?? throw new WarningException("未找到目的地" + model.To);
                var edgeName = $"{model.From}-{model.To}";
                var edge = _wcsDbContext.EdgeInfos.AsNoTracking().FirstOrDefault(x => x.EdgeName == edgeName);
                if (edge != null) throw new WarningException($"已存在路径{edgeName}");

                var newEdge = CreateEdge(fnode, tnode);
                _wcsDbContext.EdgeInfos.Add(newEdge);
                _wcsDbContext.SaveChanges();
            }
            catch (Exception)
            {
                throw;
            }
        }

        public bool UpdateEdge(UIEdgeUpdateModel model)
        {
            var edgeInfo = _wcsDbContext.Set<EdgeInfo>().FirstOrDefault(x => x.Id == model.Id)
            ?? throw new WarningException($"未找到Id:{model.Id}的Edge");

            edgeInfo.ExcutePlc = model.ExcutePlc;
            edgeInfo.EdgeType = model.EdgeType;

            try
            {
                return _wcsDbContext.SaveChanges() > 0;
            }
            catch (Exception)
            {
                throw new WarningException("数据库保存失败");
            }
        }


        public bool UpdatePath(UIPathUpdateModel model)
        {
            var pathInfo = _wcsDbContext.Set<PathInfo>().FirstOrDefault(x => x.Id == model.Id)
            ?? throw new WarningException($"未找到Id:{model.Id}的Path");

            pathInfo.PathType = model.PathType;
            pathInfo.DefaultPath = model.DefaultPath;
            pathInfo.AlternatePaths = model.AlternatePaths;

            try
            {
                return _wcsDbContext.SaveChanges() > 0;
            }
            catch (Exception)
            {
                throw new WarningException("数据库保存失败");
            }
        }

        public void GenerateEdge()
        {
            var isData = _wcsDbContext.Set<EdgeInfo>().Any();
            if (isData) ClearEdge();

            var edgeDic = new Dictionary<string, EdgeInfo>();
            var nodes = _wcsDbContext.Set<NodeInfo>().AsNoTracking().ToDictionary(k => k.NodeName, v => v);

            foreach (var node in nodes.Values)
            {
                if (string.IsNullOrEmpty(node.NextNode)) continue;
                var nextnodes = node.NextNode.Split(';');

                foreach (var nextNode in nextnodes)
                {
                    if (string.IsNullOrEmpty(nextNode)) continue;

                    var edgeName = $"{node.NodeName}-{nextNode}";
                    if (edgeDic.ContainsKey(edgeName)) continue;

                    var fromNode = nodes[node.NodeName];
                    var toNode = nodes[nextNode];
                    var edgeInfo = CreateEdge(fromNode, toNode);
                    edgeDic.Add(edgeName, edgeInfo);
                }
            }

            var edges = edgeDic.Values.ToList();
            _wcsDbContext.EdgeInfos.AddRange(edges);
            _wcsDbContext.SaveChanges();
        }


        public void ClearEdge()
        {
            var edges = _wcsDbContext.Set<EdgeInfo>().ToList();
            if (!edges.Any()) return;
            _wcsDbContext.Set<EdgeInfo>().RemoveRange(edges);
            _wcsDbContext.SaveChanges();
        }

        public void ClearPath()
        {
            var paths = _wcsDbContext.Set<PathInfo>().ToList();
            if (!paths.Any()) return;
            _wcsDbContext.Set<PathInfo>().RemoveRange(paths);
            _wcsDbContext.SaveChanges();
        }



        public void GeneratePath()
        {
            GenerateEdge();

            var isData = _wcsDbContext.Set<EdgeInfo>().Any();
            if (isData) ClearPath();

            var nodes = _wcsDbContext.Set<NodeInfo>().ToDictionary(k => k.NodeName, v => v);
            var edges = _wcsDbContext.Set<EdgeInfo>().ToDictionary(k => k.EdgeName, v => v);

            var paths = GetEdgePath(edges);

            foreach (var path in AUTO_PATH)
            {
                paths.Add(path.PathName, path);
            }

            var pathList = paths.Values.ToList();
            _wcsDbContext.Set<PathInfo>().AddRange(pathList);
            _wcsDbContext.SaveChanges();
        }

        private static List<PathInfo> AUTO_PATH = new List<PathInfo>()
        {
            // 移库
            new PathInfo("CJSTW100","CJSTW200")
            {DefaultPath = "CJSTW100-CJVCV100-CJSTW200"},
            new PathInfo("CJSTW200","CJSTW100")
            {DefaultPath = "CJSTW200-CJVCV100-CJSTW100"},
            // 码头入库
            new PathInfo("CJRCV100","CJSTW100")
            {DefaultPath = "CJRCV100-CJVCV100-CJSTW100"},
            new PathInfo("CJRCV200","CJSTW100")
            {DefaultPath = "CJRCV200-CJVCV100-CJSTW100"},
            new PathInfo("CJRCV300","CJSTW200")
            {DefaultPath = "CJRCV300-CJVCV100-CJSTW200"},
            new PathInfo("CJRCV400","CJSTW200")
            {DefaultPath = "CJRCV400-CJVCV100-CJSTW200"},
            // 码头出库
            new PathInfo("CJSTW100","CJRCV100")
            {DefaultPath = "CJSTW100-CJVCV100-CJRCV100"},
            new PathInfo("CJSTW100","CJRCV200")
            {DefaultPath = "CJSTW100-CJVCV100-CJRCV200"},
            new PathInfo("CJSTW200","CJRCV300")
            {DefaultPath = "CJSTW200-CJVCV100-CJRCV300"},
            new PathInfo("CJSTW200","CJRCV400")
            {DefaultPath = "CJSTW200-CJVCV100-CJRCV400"},

            // 短巷道出库二楼
            new PathInfo("CJSTW100","CJMCV100")
            {DefaultPath = "CJSTW100-CJVCV700-CJMIFB00-CJVCVB00-CJRGV100-CJMCV100"},
            new PathInfo("CJSTW100","CJMCV200")
            {DefaultPath = "CJSTW100-CJVCV700-CJMIFB00-CJVCVB00-CJRGV100-CJMCV200"},
            new PathInfo("CJSTW100","CJMCV400")
            {DefaultPath = "CJSTW100-CJVCV700-CJMIFB00-CJVCVB00-CJRGV100-CJMCV400"},
            new PathInfo("CJSTW100","CJMCV500")
            {DefaultPath = "CJSTW100-CJVCV700-CJMIFB00-CJVCVB00-CJRGV100-CJMCV500"},
            new PathInfo("CJSTW100","CJMCV600")
            {DefaultPath = "CJSTW100-CJVCV700-CJMIFB00-CJVCVB00-CJRGV100-CJMCV600"},
            new PathInfo("CJSTW100","CJMCV800")
            {DefaultPath = "CJSTW100-CJVCV700-CJMIFB00-CJVCVB00-CJRGV100-CJMCV800"},
            new PathInfo("CJSTW100","CJMCV900")
            {DefaultPath = "CJSTW100-CJVCV700-CJMIFB00-CJVCVB00-CJRGV100-CJMCV900"},
            // 长巷道出库二楼
            new PathInfo("CJSTW200","CJMCV100")
            {DefaultPath = "CJSTW200-CJVCV300-CJRGV200-CJVCV500-CJMIFB00-CJVCVB00-CJRGV100-CJMCV100"},
            new PathInfo("CJSTW200","CJMCV200")
            {DefaultPath = "CJSTW200-CJVCV300-CJRGV200-CJVCV500-CJMIFB00-CJVCVB00-CJRGV100-CJMCV200"},
            new PathInfo("CJSTW200","CJMCV400")
            {DefaultPath = "CJSTW200-CJVCV300-CJRGV200-CJVCV500-CJMIFB00-CJVCVB00-CJRGV100-CJMCV400"},
            new PathInfo("CJSTW200","CJMCV500")
            {DefaultPath = "CJSTW200-CJVCV300-CJRGV200-CJVCV500-CJMIFB00-CJVCVB00-CJRGV100-CJMCV500"},
            new PathInfo("CJSTW200","CJMCV600")
            {DefaultPath = "CJSTW200-CJVCV300-CJRGV200-CJVCV500-CJMIFB00-CJVCVB00-CJRGV100-CJMCV600"},
            new PathInfo("CJSTW200","CJMCV800")
            {DefaultPath = "CJSTW200-CJVCV300-CJRGV200-CJVCV500-CJMIFB00-CJVCVB00-CJRGV100-CJMCV800"},
            new PathInfo("CJSTW200","CJMCV900")
            {DefaultPath = "CJSTW200-CJVCV300-CJRGV200-CJVCV500-CJMIFB00-CJVCVB00-CJRGV100-CJMCV900"},
            // 成品入库
            new PathInfo("CJMCV300","CJSTW100")
            {DefaultPath = "CJMCV300-CJRGV100-CJVCVC00-CJMIFC00-CJVCV800-CJSTW100"},
            new PathInfo("CJMCV700","CJSTW100")
            {DefaultPath = "CJMCV700-CJRGV100-CJVCVC00-CJMIFC00-CJVCV800-CJSTW100"},
            new PathInfo("CJMCV300","CJSTW200")
            {DefaultPath = "CJMCV300-CJRGV100-CJVCVC00-CJMIFC00-CJVCV600-CJRGV200-CJVCV400-CJSTW200"},
            new PathInfo("CJMCV700","CJSTW200")
            {DefaultPath = "CJMCV700-CJRGV100-CJVCVC00-CJMIFC00-CJVCV600-CJRGV200-CJVCV400-CJSTW200"},
            // 缓存位
            new PathInfo("CJBUF101","CJMCV100")
            {DefaultPath = "CJBUF101-CJRGV100-CJMCV100"},
            new PathInfo("CJBUF101","CJMCV200")
            {DefaultPath = "CJBUF101-CJRGV100-CJMCV200"},
            new PathInfo("CJBUF101","CJMCV800")
            {DefaultPath = "CJBUF101-CJRGV100-CJMCV800"},
            new PathInfo("CJBUF101","CJMCV900")
            {DefaultPath = "CJBUF101-CJRGV100-CJMCV900"},

            new PathInfo("CJBUF102","CJMCV100")
            {DefaultPath = "CJBUF102-CJRGV100-CJMCV100"},
            new PathInfo("CJBUF102","CJMCV200")
            {DefaultPath = "CJBUF102-CJRGV100-CJMCV200"},
            new PathInfo("CJBUF102","CJMCV800")
            {DefaultPath = "CJBUF102-CJRGV100-CJMCV800"},
            new PathInfo("CJBUF102","CJMCV900")
            {DefaultPath = "CJBUF102-CJRGV100-CJMCV900"},

            new PathInfo("CJBUF103","CJMCV100")
            {DefaultPath = "CJBUF103-CJRGV100-CJMCV100"},
            new PathInfo("CJBUF103","CJMCV200")
            {DefaultPath = "CJBUF103-CJRGV100-CJMCV200"},
            new PathInfo("CJBUF103","CJMCV800")
            {DefaultPath = "CJBUF103-CJRGV100-CJMCV800"},
            new PathInfo("CJBUF103","CJMCV900")
            {DefaultPath = "CJBUF103-CJRGV100-CJMCV900"},

            new PathInfo("CJBUF104","CJMCV100")
            {DefaultPath = "CJBUF104-CJRGV100-CJMCV100"},
            new PathInfo("CJBUF104","CJMCV200")
            {DefaultPath = "CJBUF104-CJRGV100-CJMCV200"},
            new PathInfo("CJBUF104","CJMCV800")
            {DefaultPath = "CJBUF104-CJRGV100-CJMCV800"},
            new PathInfo("CJBUF104","CJMCV900")
            {DefaultPath = "CJBUF104-CJRGV100-CJMCV900"},
            // 缓存位（测试用）
            new PathInfo("CJSTW200","CJBUF101")
            {DefaultPath = "CJSTW200-CJVCV300-CJRGV200-CJVCV500-CJMIFB00-CJVCVB00-CJRGV100-CJBUF101"},
            new PathInfo("CJSTW200","CJBUF102")
            {DefaultPath = "CJSTW200-CJVCV300-CJRGV200-CJVCV500-CJMIFB00-CJVCVB00-CJRGV100-CJBUF102"},
            new PathInfo("CJSTW200","CJBUF103")
            {DefaultPath = "CJSTW200-CJVCV300-CJRGV200-CJVCV500-CJMIFB00-CJVCVB00-CJRGV100-CJBUF103"},
            new PathInfo("CJSTW200","CJBUF104")
            {DefaultPath = "CJSTW200-CJVCV300-CJRGV200-CJVCV500-CJMIFB00-CJVCVB00-CJRGV100-CJBUF104"},
            new PathInfo("CJSTW100","CJBUF101")
            {DefaultPath = "CJSTW100-CJVCV700-CJMIFB00-CJVCVB00-CJRGV100-CJBUF101"},
            new PathInfo("CJSTW100","CJBUF102")
            {DefaultPath = "CJSTW100-CJVCV700-CJMIFB00-CJVCVB00-CJRGV100-CJBUF102"},
            new PathInfo("CJSTW100","CJBUF103")
            {DefaultPath = "CJSTW100-CJVCV700-CJMIFB00-CJVCVB00-CJRGV100-CJBUF103"},
            new PathInfo("CJSTW100","CJBUF104")
            {DefaultPath = "CJSTW100-CJVCV700-CJMIFB00-CJVCVB00-CJRGV100-CJBUF104"},

            new PathInfo("CJBUF101","CJSTW100")
            {DefaultPath = "CJBUF101-CJRGV100-CJVCVC00-CJMIFC00-CJVCV800-CJSTW100"},
            new PathInfo("CJBUF102","CJSTW100")
            {DefaultPath = "CJBUF102-CJRGV100-CJVCVC00-CJMIFC00-CJVCV800-CJSTW100"},
            new PathInfo("CJBUF103","CJSTW100")
            {DefaultPath = "CJBUF103-CJRGV100-CJVCVC00-CJMIFC00-CJVCV800-CJSTW100"},
            new PathInfo("CJBUF104","CJSTW100")
            {DefaultPath = "CJBUF104-CJRGV100-CJVCVC00-CJMIFC00-CJVCV800-CJSTW100"},

            new PathInfo("CJBUF101","CJSTW200")
            {DefaultPath = "CJBUF101-CJRGV100-CJVCVC00-CJMIFC00-CJVCV600-CJRGV200-CJVCV400-CJSTW200"},
            new PathInfo("CJBUF102","CJSTW200")
            {DefaultPath = "CJBUF102-CJRGV100-CJVCVC00-CJMIFC00-CJVCV600-CJRGV200-CJVCV400-CJSTW200"},
            new PathInfo("CJBUF103","CJSTW200")
            {DefaultPath = "CJBUF103-CJRGV100-CJVCVC00-CJMIFC00-CJVCV600-CJRGV200-CJVCV400-CJSTW200"},
            new PathInfo("CJBUF104","CJSTW200")
            {DefaultPath = "CJBUF104-CJRGV100-CJVCVC00-CJMIFC00-CJVCV600-CJRGV200-CJVCV400-CJSTW200"},


            new PathInfo("CJVCV700","CJBUF101")
            {DefaultPath = "CJVCV700-CJMIFB00-CJVCVB00-CJRGV100-CJBUF101"},
            new PathInfo("CJVCVC00","CJBUF101")
            {DefaultPath = "CJVCVC00-CJRGV100-CJBUF101"},
        };

        private Dictionary<string, PathInfo> GetEdgePath(Dictionary<string, EdgeInfo> edges)
        => edges.Values.Select(x => new PathInfo(x.FromNode, x.ToNode)
        {
            DefaultPath = x.EdgeName
        }).ToDictionary(k => k.PathName, v => v);

        private EdgeInfo CreateEdge(NodeInfo f, NodeInfo t)
        {
            var edge = new EdgeInfo()
            {
                EdgeName = $"{f.NodeName}-{t.NodeName}",
                FromNode = f.NodeName,
                ToNode = t.NodeName,
                ExcutePlc = "Pcon01",
                EdgeType = (int)EnumSubTaskType.PconTask,
            };

            if (f.DeviceType == "con" && t.DeviceType == "srm")
            {
                edge.EdgeType = (int)EnumSubTaskType.SrmInTask;
            }
            else if (f.DeviceType == "srm" && t.DeviceType == "con")
            {
                edge.EdgeType = (int)EnumSubTaskType.SrmOutTask;
            }
            else if (t.NodeName == f.NodeName)
            {
                edge.EdgeType = (int)EnumSubTaskType.SrmMoveTask;
            }
            else if ((t.NodeName.Contains("CJRCV") && f.NodeName.Contains("CJVCV"))
                    || (t.NodeName.Contains("CJVCV") && f.NodeName.Contains("CJRCV"))
                    || (t.NodeName.Contains("CJVCV") && f.NodeName.Contains("CJVCV"))
                    )
            {
                edge.EdgeType = (int)EnumSubTaskType.SrmStraightOutTask;
            }

            if (edge.EdgeType != (int)EnumSubTaskType.PconTask)
            {
                if (f.NodeName == "CJSTW100" || t.NodeName == "CJSTW100")
                {
                    edge.ExcutePlc = "CJSTW100";
                }
                else if (f.NodeName == "CJSTW200" || t.NodeName == "CJSTW200")
                {
                    edge.ExcutePlc = "CJSTW200";
                }
                else if (f.NodeName == "CJVCV100" || f.NodeName == "CJVCV200")
                {
                    if (t.NodeName == "CJRCV100" || t.NodeName == "CJRCV200" || t.NodeName == "CJVCV300" || t.NodeName == "CJVCV400")
                    {
                        edge.ExcutePlc = "CJSTW200";
                    }
                    else
                    {
                        edge.ExcutePlc = "CJSTW100";
                    }
                }
                else if (t.NodeName == "CJVCV100" || t.NodeName == "CJVCV200")
                {
                    if (f.NodeName == "CJRCV100" || f.NodeName == "CJRCV200" || f.NodeName == "CJVCV300" || f.NodeName == "CJVCV400")
                    {
                        edge.ExcutePlc = "CJSTW200";
                    }
                    else
                    {
                        edge.ExcutePlc = "CJSTW100";
                    }
                }
                else
                {
                    edge.ExcutePlc = "Srm";
                }
            }

            return edge;
        }

    }
}
